from urllib.parse import urljoin
import requests
from selenium import webdriver
import time
from selenium.webdriver.common.by import By

"""
对于基于 Session + Cookie 验证的网站，模拟登录的核心要点就是获取 Cookie。这个 Cookie 可以被保存下来或传递给其他的程序继续使用，甚至可以将 Cookie 持久化存储或传输给其他终端来使用。
另外，为了提高 Cookie 利用率或降低封号概率，可以搭建一个账号池实现 Cookie 的随机取用。
"""

"""
 方式1 会话1请求登录接口+获取到cookie，然后会话2请求携带cookie
 
 allow_redirects=False 非常重要：
    登录接口通常会在登录成功后返回 302 重定向响应跳转到其他页面。
    如果允许重定向，requests 会自动跟随跳转，导致最终响应的 cookies 不一定是登录接口返回的 cookie，可能被覆盖或者丢失。
    禁止自动重定向可以直接拿到登录接口返回的 Set-Cookie 信息。
"""
# login_url = 'https://login2.scrape.center/login'
# index_url = 'https://login2.scrape.center/page/1'
# # 请求登录接口获取cookie
# data = {
#     'username': 'admin',
#     'password': 'admin'
# }
# headers = {
#     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
#     'Referer': 'https://login2.scrape.center/login'
# }
# res_login = requests.post(url=login_url, data=data, headers=headers,
#                           allow_redirects=False)  # allow_redirects 注意要设置不允许重定向，如果允许重定向拿到的cookie会无法用
# cookies = res_login.cookies
# print('cookies', cookies)
#
# # 请求首页-携带cookies
# res = requests.get(url=index_url, headers=headers, cookies=cookies)
# print(res.status_code)
# print(res.text)

"""
 方式2 使用同一个session会话，请求登录接口，自主维护cookie，然后用相同会话发起请求
 这种方式，请求会自己携带cookie，不用手动设置 ------------ 推荐
"""

# login_url = 'https://login2.scrape.center/login'
# index_url = 'https://login2.scrape.center/page/1'
# # 所有接口使用相同的session会话，自动维护cookies
# session = requests.session()
# # 请求登录接口
# data = {
#     'username': 'admin',
#     'password': 'admin'
# }
# headers = {
#     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
#     'Referer': 'https://login2.scrape.center/login'
# }
# # 登录接口请求后，session会自动维护cookies
# session.post(url=login_url, data=data, headers=headers)
# # 请求首页接口
# res = session.get(url=index_url, headers=headers)
# print(res.status_code)
# print(res.text)




"""
 方式3 使用selenium模拟登录获取到cookie，然后request请求携带cookie
"""


BASE_URL = 'https://login2.scrape.center/'
LOGIN_URL = urljoin(BASE_URL, '/login')
INDEX_URL = urljoin(BASE_URL, '/page/1')
USERNAME = 'admin'
PASSWORD = 'admin'

browser = webdriver.Chrome()
browser.get(BASE_URL)
browser.find_element(By.CSS_SELECTOR,'input[name="username"]').send_keys(USERNAME)
browser.find_element(By.CSS_SELECTOR,'input[name="password"]').send_keys(USERNAME)
browser.find_element(By.CSS_SELECTOR,'input[type="submit"]').click()
time.sleep(10)

# get cookies from selenium
cookies = browser.get_cookies()
print('Cookies', cookies)
browser.close()

# set cookies to requests
session = requests.Session()
for cookie in cookies:
    session.cookies.set(cookie['name'], cookie['value'])

response_index = session.get(INDEX_URL)
print('Response Status', response_index.status_code)
print('Response URL', response_index.url)








